#include <stdio.h>

// struct people
// {
//     char name[20];
//     char tel[12];
//     char sex[5];
//     int height;
// }p1,p2;//此时p1p2为全局变量 尽量少使用这种方式
// void print1(struct people* p)
// {
//     printf("%s,%s,%s,%d\n",p->name,p->tel,p->sex,p->height);
// }
// void print2(struct people p)
// {
//     printf("%s,%s,%s,%d\n",p.name,p.tel,p.sex,p.height);
// }
// int main()
// {
//     struct people p3 = { "zhangsan","18888888888","男",185 };
//     printf("%s,%s,%s,%d\n",p3.name,p3.tel,p3.sex,p3.height);
//     print1(&p3);//对象与指针的区别 对象用. 指针用->
//     print2(p3);//传递对象 会浪费空间与时间 开辟新空间，复制过去
//     return 0;
// }



//往期作业 


// //写一个函数返回参数二进制中1的个数
// //思路 首先思考如果是十进制中1的个数该怎么做
// //1234/%10  4  
// //1234/10   123
// //123%10    3
// //123/10    12
// //12%10     2
// //12/10     1
// //1%10      1
// //1/10      0 
// //参考这个 二进制中 就是%2 /2  这个过程也就把该数拆解为了二进制
// //如11  二进制为 1011
// //11%2  1
// //11/2  5  5的二进制为101
// //5%2   1
// //5/2   2  2的二进制为10
// //······以此类推
// int count_1(unsigned int n)//若接受为int n 对于负数会失效
// {
//     int count = 0;
//     while(n != 0) //也可以写成 while（n）
//     {
//         if(n%2 == 1)
//            count++;
//         n = n/2;
//     }
//     return count;
// }
// int count_2(int n)
// {
//     int i = 0;
//     int count =0;
//     for(i = 0;i < 32;i++)
//     {
//         if((n >> i)&1) //按位与1 移动0位开始 移动32次就完成了
//            count++;
//     }
//     return count;
// }
// int count_3(int n)//最巧妙的一个方法
// {
//     int count = 0;
//     while(n)
//     {
//         n = n & (n-1);//n&(n-1)会去掉2进制n中最右侧的1
//         count++;
//     }
//     return count;
// }
// //扩展 n&n-1还有别的用法 判断一个数是不是2的n次方
// //2 10   4 100  8 1000 16 10000
// //if((n & (n-1) == 0) ······
// int main()
// {
//     int num = 0;
//     scanf("%d",&num);
//     int n1 = count_1(num);
//     printf("%d\n",n1);
//     int n2 = count_2(num);
//     printf("%d\n",n2);
//     int n3 = count_3(num);
//     printf("%d\n",n3);
//     return 0;
// }





// //统计两个数的二进制中不同位的个数
// int count_diff1(int m,int n)
// {
//     int i = 0;
//     int count = 0;
//     for(i = 0;i<32;i++)
//     {
//         if(((m >> i)&1) != ((n >> i)&1))
//            count ++;
//     }
//     return count;
// }
// int count_diff2(int m,int n)
// {
//     int count = 0;
//     int ret = m^n;
//     while(ret)
//     {
//         ret = ret&(ret -1);
//         count++;
//     }
//     return count;
// }
// int main()
// {
//     int m = 0;
//     int n = 0;
//     scanf("%d %d",&m,&n);
//     int n1 = count_diff1(m,n);
//     int n2 = count_diff2(m,n);
//     printf("%d\n",n1);
//     printf("%d\n",n2);
//     return 0;
// }





// //获取一个整数二进制序列中所有的偶数位与奇数位，分别打印出二进制序列
// int main()
// {
//     int n = 0;
//     scanf("%d",&n);
//     int i = 0;
//     for(i=31;i>=1;i-=2)
//     {
//         printf("%d ",((n >> i)&1));
//     }
//     printf("\n");
//     for(i=30;i>=0;i-=2)
//     {
//         printf("%d ",((n >> i)&1));
//     }
//     return 0;
// }





// //打印x图形 输入数字（2-20） 输出x图形 数字代表行数，也代表斜线和反斜线的*的个数
// int main()
// {
//     int n = 0;
//     scanf("%d",&n);
//     int i = 0;
//     for(i = 1;i<=n;i++)
//     {
//         int j = 0;
//         for(j= 1;j<=n;j++)
//         {
//             if((j == i) || (j == (n-i+1)))//还有种写法是i+j=n-1
//                printf("*");
//             else
//                printf(" ");
//         }
//         printf("\n");
//     }
//     return 0;
// }





//输入年份和月份 输出这个月有多少天
int is_leap_year(int y)
{
    if((y%4 == 0)&&((y%100) != 0)||(y%400 == 0))
       return 1;
    else 
       return 0;
}
int main()
{
    int y = 0;
    int m = 0;
    int d = 0;
    int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    while(scanf("%d%d",&y,&m))
    {
        d= days[m];
        if(is_leap_year(y))
           d++;
        printf("%d\n",d);
    }
    return 0;
}